package br.unicamp.ic.sgct.client.apresentacao.ucs;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.set.CompositeSet.SetMutator;
import org.gwtiger.client.screen.BaseScreen;
import org.gwtiger.client.widget.field.PasswordFieldWidget;
import org.gwtiger.client.widget.field.TextFieldWidget;

import br.unicamp.ic.sgct.client.aplicacao.ucs.cancelamento.CancelamentoListener;
import br.unicamp.ic.sgct.client.apresentacao.internacionalizacao.Mensagens;
import br.unicamp.ic.sgct.client.apresentacao.widgets.ButtonCampoForm;
import br.unicamp.ic.sgct.client.apresentacao.widgets.LabelCampoForm;
import br.unicamp.ic.sgct.client.apresentacao.widgets.MensagemUI;
import br.unicamp.ic.sgct.client.dominio.exception.InfraException;
import br.unicamp.ic.sgct.client.dominio.to.ConferenciaTO;
import br.unicamp.ic.sgct.client.dominio.to.InscricaoTO;
import br.unicamp.ic.sgct.client.dominio.to.PessoaTO;
import br.unicamp.ic.sgct.client.dominio.to.SessaoTO;
import br.unicamp.ic.sgct.client.dominio.to.UsuarioTO;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FocusListener;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.HTMLTable.RowFormatter;

/*
 * alterada
 */
public class CancelamentoScreen extends BaseScreen implements FocusListener{
	
	private static final String MSG_INSCRICOES_REQ = "Selecione pelo menos 1 inscri��o para ser cancelada";

	//INICIO - EXERC. 7
	
	private static Mensagens mensagens = GWT.create(Mensagens.class);
	
	private final String MSG_REQUIRED_ERR = mensagens.requiredErr();
	
	private UsuarioTO usuario = null;
	private CancelamentoListener controladora;

/*    private StackPanel panelTabelas = new StackPanel();*/
	private FlexTable tblUsuario = new FlexTable();

	//dados usuario
	private TextFieldWidget txtbEmail = null;
	private PasswordFieldWidget txtbSenha = null;

	/*private ValidatePanel panelValidate = new ValidatePanel();*/	

	//INICIO - EXERC. 5 
	private List<InscricaoTO> inscricoes = new ArrayList<InscricaoTO>();
	
	public void setInscricoes(List<InscricaoTO> inscricoes) {
		this.inscricoes = inscricoes;
		montarGridInscricoes();
	}


	private DateTimeFormat _dtTimeFormat = DateTimeFormat.getFormat("dd/MM/yyy");
	
	private Map<InscricaoTO, CheckBox> mapInscricoesCheckbox;
	
	
	private VerticalPanel panelInscricoes = new VerticalPanel();
	
	private ButtonCampoForm btnConfirmar = new ButtonCampoForm("<i>" + mensagens.confirmarCancelamento() + "</i>");
	private ButtonCampoForm btnLimpar = new ButtonCampoForm("<i>" + mensagens.limparDados() + "</i>");
	
	//FIM - EXERC. 5 
	/**
	 * 
	 * @param usuario
	 * @param controladora
	 */
	public CancelamentoScreen(UsuarioTO usuario, final CancelamentoListener controladora) {
		super();
		this.controladora = controladora;

		this.usuario = usuario;
		
/*		ScrollPanel panelScroll = new ScrollPanel();
		panelScroll.setAlwaysShowScrollBars(true);*/		

		VerticalPanel panelGeral = new VerticalPanel();
		panelGeral.setWidth("100%");
		panelGeral.setSpacing(10);
        panelGeral.add( controladora.getMensagemWidget() );
/*        panelGeral.add(panelTabelas);
	
        panelTabelas.setWidth("100%");*/
        txtbEmail = new TextFieldWidget(mensagens.email());
        txtbEmail.setRequired(true);
        /*txtbEmail.setFocus(true);*/ //TODO: recompilar lib      
        tblUsuario.setWidget(0, 0, txtbEmail);        

        txtbSenha = new PasswordFieldWidget(mensagens.senha());
        txtbSenha.setRequired(true);
        tblUsuario.setWidget(1, 0, txtbSenha);
	
		tblUsuario.setCellSpacing(05);
		tblUsuario.setCellPadding(05);
/*		panelTabelas.add(tblUsuario, "Cancelamento de inscri\u00e7\u00e3o");*/
		
		
	
        HorizontalPanel panelBtn = new HorizontalPanel();
        panelBtn.add(btnConfirmar);
        panelBtn.add(btnLimpar);
        panelBtn.setSpacing(6);

        panelGeral.add(tblUsuario);
        
        //INICIO - EXERC. 5
        panelInscricoes.setVisible(false);
		panelGeral.add( panelInscricoes );
		btnConfirmar.setEnabled(false);
		//FIM - EXERC. 5 
        
        panelGeral.add(panelBtn);

        panelGeral.setCellWidth(panelBtn, "100%");

        String width  = String.valueOf( panelGeral.getOffsetWidth() + 5);
		String height = String.valueOf( panelGeral.getOffsetHeight() + 5);
/*		panelScroll.setSize(width + "px", height + "px");
		panelScroll.add(panelGeral);
*/	
		//Acao cancelar
		btnConfirmar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				cancelar();
            }
        });
			
	
		btnLimpar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				txtbSenha.clear();
				txtbEmail.clear();
				//INICIO - EXERC. 5
				panelInscricoes.clear();
				panelInscricoes.setVisible(false);
				btnConfirmar.setEnabled(false);
				//FIM - EXERC. 5
				if ( controladora.getMensagemWidget() instanceof MensagemUI ) {
					controladora.getMensagemWidget().setMensagemSucesso("");
					controladora.getMensagemWidget().setMensagemErro("");
					controladora.getMensagemWidget().setVisible(false);
				}
			}
        });
		//INICIO - EXERC. 5
		txtbSenha.addFocusListener(this);
		//FIM - EXERC. 5	
		
	///*		txtbConfirmacao.addKeyUpHandler(new KeyUpHandler() {
	//			public void onKeyUp(KeyUpEvent event) {
	//				txtbNome.setFocus(true);
	//			}
	//		});
	//
	//		txtbConfirmacao.addKeyPressHandler(new KeyPressHandler() {
	//			public void onKeyPress(KeyPressEvent event) {
	//				if (event.isControlKeyDown())
	//					txtbNome.setFocus(true);
	//			}
	//		});
	//*/

		this.initWidget(panelGeral);

	}
	
	/*
	 * Direciona para o servidor processamento dos dados coletados
	 */
	private boolean cancelar() {
		boolean valid = true;
		
		valid = txtbSenha.validate();
		valid = txtbEmail.validate() && valid;
		this.controladora.setScreen(this);
		
		if (!valid) {
			this.controladora.getMensagemWidget().setMensagemErro(MSG_REQUIRED_ERR);			
			return valid;
		}
        else {
        	
        	//INICIO - EXERC. 5
    	    
    	    //Validador de inscricoes
    	    List<InscricaoTO> inscricoesListTO = new ArrayList<InscricaoTO>();
    	    for (InscricaoTO sessaoTo : mapInscricoesCheckbox.keySet()) {
    	    	if (mapInscricoesCheckbox.get(sessaoTo).getValue()) {
    	    		inscricoesListTO.add(sessaoTo);
    		    
    	    	}
    		
    	    }
    	    
    	    if (inscricoesListTO.isEmpty()) {
	    		this.controladora.setMensagemErro(MSG_INSCRICOES_REQ);
	    		return false;
    	    }	
    	    
	        	
	        	this.usuario.setEmail(txtbEmail.getText());
				this.usuario.setSenha(txtbSenha.getText());
	
				PessoaTO pessoa = new PessoaTO();
				pessoa.setNome("");
				pessoa.setSobreNome("");
				pessoa.setFoneResidencial("");
				pessoa.setCelular("");
	
				this.usuario.setPessoa(pessoa);
				this.usuario.setInscricaoList(inscricoesListTO);
				this.controladora.cancelar(usuario);
			//FIM - EXERC. 5	
    	    
        }
        return true;
	}
	
	//INICIO - EXERC. 5
	@Override
	public void onFocus(Widget sender) {
		// do nothing
		
	}
	
	@Override
	public void onLostFocus(Widget sender) {
		// TODO Auto-generated method stub
		panelInscricoes.clear();
		listarInscricoes();
		showLoading(true);
		
		montarGridInscricoes();
		
	}

	private void montarGridInscricoes() {
		List<InscricaoTO> lstInscricoesTO = inscricoes;

		if (lstInscricoesTO != null && !lstInscricoesTO.isEmpty()) {
			panelInscricoes.add(new LabelCampoForm("Selecione as incri��es a serem canceladas:"));
			mapInscricoesCheckbox = new HashMap<InscricaoTO, CheckBox>();
			btnConfirmar.setEnabled(true);
			for (InscricaoTO inscricaoTO : lstInscricoesTO) {
			    	CheckBox checkbox = new CheckBox( _dtTimeFormat.format(inscricaoTO.getDataInscricao()) + " - " + inscricaoTO.getSessao().getTema() );
			    	checkbox.addStyleDependentName("Form");
			    	mapInscricoesCheckbox.put(inscricaoTO, checkbox);
			    
				panelInscricoes.add( checkbox );
				
			}
		} 
		
		panelInscricoes.setVisible(true);
		showLoading(false);
	}

	
	
	private void listarInscricoes() {
		// TODO Auto-generated method stub
		boolean valid = true;
		
		valid = txtbSenha.validate();
		valid = txtbEmail.validate() && valid;
		this.controladora.setScreen(this);
		if (!valid) {
			
			this.controladora.getMensagemWidget().setMensagemErro(MSG_REQUIRED_ERR);			
		}
        else {
        	this.usuario.setEmail(txtbEmail.getText());
			this.usuario.setSenha(txtbSenha.getText());

			PessoaTO pessoa = new PessoaTO();
			pessoa.setNome("");
			pessoa.setSobreNome("");
			pessoa.setFoneResidencial("");
			pessoa.setCelular("");

			this.usuario.setPessoa(pessoa);

			try {
				this.controladora.listarInscricoes(usuario);
			} catch (InfraException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        }
	}
	//FIM - EXERC. 5 
	//FIM - EXERC. 7
}